{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "pdf-title"
    ]
   },
   "source": [
    "# Convolutional Networks\n",
    "So far we have worked with deep fully-connected networks, using them to explore different optimization strategies and network architectures. \n",
    "\n",
    "Fully-connected networks are a good testbed for experimentation because they are very computationally efficient, but in practice all state-of-the-art results use convolutional networks instead.\n",
    "\n",
    "First you will implement several layer types that are used in convolutional networks. \n",
    "\n",
    "You will then use these layers to train a convolutional network on the CIFAR-10 dataset.\n",
    "\n",
    "到目前为止，我们已经使用深度全连接网络，使用它们来探索不同的优化策略和网络架构。\n",
    "\n",
    "全连接网络是一个很好的实验平台，因为它们的计算效率非常高，但实际上，所有最先进的结果都使用了卷积网络。\n",
    "\n",
    "首先，您将实现几个在卷积网络中使用的层类型。\n",
    "\n",
    "然后，您将使用这些层在CIFAR-10数据集上训练卷积网络。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "run the following from the cs231n directory and try again:\n",
      "python setup.py build_ext --inplace\n",
      "You may also need to restart your iPython kernel\n"
     ]
    }
   ],
   "source": [
    "# As usual, a bit of setup\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from cs231n.classifiers.cnn import *\n",
    "from cs231n.data_utils import get_CIFAR10_data\n",
    "from cs231n.gradient_check import eval_numerical_gradient_array, eval_numerical_gradient\n",
    "from cs231n.layers import *\n",
    "from cs231n.fast_layers import *\n",
    "from cs231n.solver import Solver\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] = (10.0, 8.0)  # set default size of plots\n",
    "plt.rcParams['image.interpolation'] = 'nearest'\n",
    "plt.rcParams['image.cmap'] = 'gray'\n",
    "\n",
    "# for auto-reloading external modules\n",
    "# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "\n",
    "def rel_error(x, y):\n",
    "    \"\"\" returns relative error \"\"\"\n",
    "    return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train:  (49000, 3, 32, 32)\n",
      "y_train:  (49000,)\n",
      "X_val:  (1000, 3, 32, 32)\n",
      "y_val:  (1000,)\n",
      "X_test:  (1000, 3, 32, 32)\n",
      "y_test:  (1000,)\n"
     ]
    }
   ],
   "source": [
    "# Load the (preprocessed) CIFAR10 data.\n",
    "\n",
    "data = get_CIFAR10_data()\n",
    "for k, v in data.items():\n",
    "    print('%s: ' % k, v.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive forward pass\n",
    "The core of a convolutional network is the convolution operation. \n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for the convolution layer in the function `conv_forward_naive`. \n",
    "\n",
    "You don't have to worry too much about efficiency at this point; just write the code in whatever way you find most clear.\n",
    "\n",
    "You can test your implementation by running the following:\n",
    "\n",
    "卷积网络的核心是卷积运算。\n",
    "\n",
    "在文件`cs231n/layers.py`的函数`conv_forward_naive`中实现卷积层的前向传播。\n",
    "\n",
    "在这一点上你不必太担心效率;只要用你认为最清楚的方式来写代码。\n",
    "\n",
    "你可以通过运行以下程序来测试你的实现:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_naive\n",
      "difference:  2.2121476417505994e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "w_shape = (3, 3, 4, 4)\n",
    "x = np.linspace(-0.1, 0.5, num=np.prod(x_shape)).reshape(x_shape)\n",
    "w = np.linspace(-0.2, 0.3, num=np.prod(w_shape)).reshape(w_shape)\n",
    "b = np.linspace(-0.1, 0.2, num=3)\n",
    "\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "out, _ = conv_forward_naive(x, w, b, conv_param)\n",
    "correct_out = np.array([[[[-0.08759809, -0.10987781],\n",
    "                           [-0.18387192, -0.2109216 ]],\n",
    "                          [[ 0.21027089,  0.21661097],\n",
    "                           [ 0.22847626,  0.23004637]],\n",
    "                          [[ 0.50813986,  0.54309974],\n",
    "                           [ 0.64082444,  0.67101435]]],\n",
    "                         [[[-0.98053589, -1.03143541],\n",
    "                           [-1.19128892, -1.24695841]],\n",
    "                          [[ 0.69108355,  0.66880383],\n",
    "                           [ 0.59480972,  0.56776003]],\n",
    "                          [[ 2.36270298,  2.36904306],\n",
    "                           [ 2.38090835,  2.38247847]]]])\n",
    "\n",
    "# Compare your output to ours; difference should be around e-8\n",
    "print('Testing conv_forward_naive')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Aside: Image processing via convolutions\n",
    "\n",
    "As fun way to both check your implementation and gain a better understanding of the type of operation that convolutional layers can perform, we will set up an input containing two images and manually set up filters that perform common image processing operations (grayscale conversion and edge detection). \n",
    "\n",
    "The convolution forward pass will apply these operations to each of the input images. \n",
    "\n",
    "We can then visualize the results as a sanity check.\n",
    "\n",
    "我们将设置一个包含两个图像的输入，并手动设置过滤器来执行常见的图像处理操作(灰度转换和边缘检测)，这是一种既可以检查实现又可以更好地了解卷积层可以执行的操作类型的有趣方法。\n",
    "\n",
    "卷积前向传递将对每个输入图像应用这些操作。\n",
    "\n",
    "然后，我们可以将结果可视化为一个完整性检查。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": [
     "pdf-ignore-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from imageio import imread\n",
    "from PIL import Image\n",
    "\n",
    "kitten = imread('notebook_images/kitten.jpg')\n",
    "puppy = imread('notebook_images/puppy.jpg')\n",
    "# kitten is wide, and puppy is already square\n",
    "# 小猫是宽的，小狗是方的\n",
    "d = kitten.shape[1] - kitten.shape[0]\n",
    "kitten_cropped = kitten[:, d//2:-d//2, :]\n",
    "\n",
    "img_size = 200   # Make this smaller if it runs too slow\n",
    "resized_puppy = np.array(Image.fromarray(puppy).resize((img_size, img_size)))\n",
    "resized_kitten = np.array(Image.fromarray(kitten_cropped).resize((img_size, img_size)))\n",
    "x = np.zeros((2, 3, img_size, img_size))\n",
    "x[0, :, :, :] = resized_puppy.transpose((2, 0, 1))\n",
    "x[1, :, :, :] = resized_kitten.transpose((2, 0, 1))\n",
    "\n",
    "# Set up a convolutional weights holding 2 filters, each 3x3\n",
    "w = np.zeros((2, 3, 3, 3))\n",
    "\n",
    "# The first filter converts the image to grayscale.\n",
    "# Set up the red, green, and blue channels of the filter.\n",
    "w[0, 0, :, :] = [[0, 0, 0], [0, 0.3, 0], [0, 0, 0]]\n",
    "w[0, 1, :, :] = [[0, 0, 0], [0, 0.6, 0], [0, 0, 0]]\n",
    "w[0, 2, :, :] = [[0, 0, 0], [0, 0.1, 0], [0, 0, 0]]\n",
    "\n",
    "# Second filter detects horizontal edges in the blue channel.\n",
    "w[1, 2, :, :] = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]]\n",
    "\n",
    "# Vector of biases. We don't need any bias for the grayscale\n",
    "# filter, but for the edge detection filter we want to add 128\n",
    "# to each output so that nothing is negative.\n",
    "# 偏置向量。我们不需要任何偏置的灰度过滤器，\n",
    "# 但对于边缘检测过滤器，我们想要增加128到每个输出，所以没有什么是负的。\n",
    "b = np.array([0, 128])\n",
    "\n",
    "# Compute the result of convolving each input in x with each filter in w,\n",
    "# offsetting by b, and storing the results in out.\n",
    "# 计算将x中的每个输入与w中的每个过滤器进行卷积，用b进行偏置，然后将结果存储到out中。\n",
    "out, _ = conv_forward_naive(x, w, b, {'stride': 1, 'pad': 1})\n",
    "\n",
    "def imshow_no_ax(img, normalize=True):\n",
    "    \"\"\" Tiny helper to show images as uint8 and remove axis labels \"\"\"\n",
    "    if normalize:\n",
    "        img_max, img_min = np.max(img), np.min(img)\n",
    "        img = 255.0 * (img - img_min) / (img_max - img_min)\n",
    "    plt.imshow(img.astype('uint8'))\n",
    "    plt.gca().axis('off')\n",
    "\n",
    "# Show the original images and the results of the conv operation\n",
    "plt.subplot(2, 3, 1)\n",
    "imshow_no_ax(puppy, normalize=False)\n",
    "plt.title('Original image')\n",
    "plt.subplot(2, 3, 2)\n",
    "imshow_no_ax(out[0, 0])\n",
    "plt.title('Grayscale')\n",
    "plt.subplot(2, 3, 3)\n",
    "imshow_no_ax(out[0, 1])\n",
    "plt.title('Edges')\n",
    "plt.subplot(2, 3, 4)\n",
    "imshow_no_ax(kitten_cropped, normalize=False)\n",
    "plt.subplot(2, 3, 5)\n",
    "imshow_no_ax(out[1, 0])\n",
    "plt.subplot(2, 3, 6)\n",
    "imshow_no_ax(out[1, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive backward pass\n",
    "Implement the backward pass for the convolution operation in the function `conv_backward_naive` in the file `cs231n/layers.py`. \n",
    "\n",
    "Again, you don't need to worry too much about computational efficiency.\n",
    "\n",
    "When you are done, run the following to check your backward pass with a numeric gradient check.\n",
    "\n",
    "在文件`cs231n/layers.py`中的函数`conv_backward_naive`中实现卷积操作的反向传播\n",
    "\n",
    "同样，你不需要太担心计算效率。\n",
    "\n",
    "完成后，运行以下命令，用数值梯度检查检查反向传播。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_backward_naive function\n",
      "dx error:  1.159803161159293e-08\n",
      "dw error:  2.247109434939654e-10\n",
      "db error:  3.37264006649648e-11\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(4, 3, 5, 5)\n",
    "w = np.random.randn(2, 3, 3, 3)\n",
    "b = np.random.randn(2,)\n",
    "dout = np.random.randn(4, 2, 5, 5)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_forward_naive(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_forward_naive(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_forward_naive(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "out, cache = conv_forward_naive(x, w, b, conv_param)\n",
    "dx, dw, db = conv_backward_naive(dout, cache)\n",
    "\n",
    "# Your errors should be around e-8 or less.\n",
    "print('Testing conv_backward_naive function')\n",
    "print('dx error: ', rel_error(dx, dx_num))\n",
    "print('dw error: ', rel_error(dw, dw_num))\n",
    "print('db error: ', rel_error(db, db_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive forward\n",
    "Implement the forward pass for the max-pooling operation in the function `max_pool_forward_naive` in the file `cs231n/layers.py`. \n",
    "\n",
    "Again, don't worry too much about computational efficiency.\n",
    "\n",
    "Check your implementation by running the following:\n",
    "\n",
    "在文件`cs231n/layers.py`中的函数`max_pool_forward_naive`中实现max-pooling操作的前向传播。\n",
    "\n",
    "同样，不要太担心计算效率。\n",
    "\n",
    "检查你的实现运行以下:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_forward_naive function:\n",
      "difference:  4.1666665157267834e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "x = np.linspace(-0.3, 0.4, num=np.prod(x_shape)).reshape(x_shape)\n",
    "pool_param = {'pool_width': 2, 'pool_height': 2, 'stride': 2}\n",
    "\n",
    "out, _ = max_pool_forward_naive(x, pool_param)\n",
    "\n",
    "correct_out = np.array([[[[-0.26315789, -0.24842105],\n",
    "                          [-0.20421053, -0.18947368]],\n",
    "                         [[-0.14526316, -0.13052632],\n",
    "                          [-0.08631579, -0.07157895]],\n",
    "                         [[-0.02736842, -0.01263158],\n",
    "                          [ 0.03157895,  0.04631579]]],\n",
    "                        [[[ 0.09052632,  0.10526316],\n",
    "                          [ 0.14947368,  0.16421053]],\n",
    "                         [[ 0.20842105,  0.22315789],\n",
    "                          [ 0.26736842,  0.28210526]],\n",
    "                         [[ 0.32631579,  0.34105263],\n",
    "                          [ 0.38526316,  0.4       ]]]])\n",
    "\n",
    "# Compare your output with ours. Difference should be on the order of e-8.\n",
    "print('Testing max_pool_forward_naive function:')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive backward\n",
    "Implement the backward pass for the max-pooling operation in the function `max_pool_backward_naive` in the file `cs231n/layers.py`. \n",
    "\n",
    "You don't need to worry about computational efficiency.\n",
    "\n",
    "Check your implementation with numeric gradient checking by running the following:\n",
    "\n",
    "在文件`cs231n/layers.py`中的函数`max_pool_backward_naive`中实现最大池操作的反向传播\n",
    "\n",
    "你不需要担心计算效率。\n",
    "\n",
    "检查你的实现与数值梯度检查运行以下:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_backward_naive function:\n",
      "dx error:  3.27562514223145e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(3, 2, 8, 8)\n",
    "dout = np.random.randn(3, 2, 4, 4)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: max_pool_forward_naive(x, pool_param)[0], x, dout)\n",
    "\n",
    "out, cache = max_pool_forward_naive(x, pool_param)\n",
    "dx = max_pool_backward_naive(dout, cache)\n",
    "\n",
    "# Your error should be on the order of e-12\n",
    "print('Testing max_pool_backward_naive function:')\n",
    "print('dx error: ', rel_error(dx, dx_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fast layers\n",
    "Making convolution and pooling layers fast can be challenging. \n",
    "\n",
    "To spare you the pain, we've provided fast implementations of the forward and backward passes for convolution and pooling layers in the file `cs231n/fast_layers.py`.\n",
    "\n",
    "The fast convolution implementation depends on a Cython extension; to compile it you need to run the following from the `cs231n` directory:\n",
    "\n",
    "快速实现卷积和池化层具有挑战性。\n",
    "\n",
    "为了避免麻烦，我们在文件`cs231n/fast_layers.py`中为卷积和池化层提供了前向和反向传播的快速实现。\n",
    "\n",
    "快速卷积的实现依赖于一个Cython扩展;要编译它，你需要运行以下`cs231n`目录:\n",
    "\n",
    "```bash\n",
    "python setup.py build_ext --inplace\n",
    "```\n",
    "\n",
    "The API for the fast versions of the convolution and pooling layers is exactly the same as the naive versions that you implemented above: \n",
    "\n",
    "the forward pass receives data, weights, and parameters and produces outputs and a cache object; \n",
    "\n",
    "the backward pass recieves upstream derivatives and the cache object and produces gradients with respect to the data and weights.\n",
    "\n",
    "卷积和池化层的快速版本的API与上面实现的原始版本完全相同:\n",
    "\n",
    "前向传播接收数据、权重和参数，并产生输出和缓存对象;\n",
    "\n",
    "反向传播接收上游导数和缓存对象，并产生与数据和权重相关的梯度。\n",
    "\n",
    "**NOTE:** The fast implementation for pooling will only perform optimally if the pooling regions are non-overlapping and tile the input. \n",
    "\n",
    "If these conditions are not met then the fast pooling implementation will not be much faster than the naive implementation.\n",
    "\n",
    "只有当池区域不重叠并平铺输入时，池化的快速实现才能优化执行。\n",
    "\n",
    "如果不满足这些条件，那么快速池化实现不会比简单实现快很多。\n",
    "\n",
    "You can compare the performance of the naive and fast versions of these layers by running the following:\n",
    "\n",
    "你可以比较这些层的性能普通和快速版本运行以下:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_fast:\n",
      "Naive: 0.241860s\n",
      "Fast: 0.022987s\n",
      "Speedup: 10.521636x\n",
      "Difference:  4.926407851494105e-11\n"
     ]
    },
    {
     "ename": "NameError",
     "evalue": "name 'col2im_6d_cython' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-11-42d3cc55da19>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     24\u001b[0m \u001b[0mdx_naive\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw_naive\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb_naive\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_backward_naive\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache_naive\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     25\u001b[0m \u001b[0mt1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 26\u001b[1;33m \u001b[0mdx_fast\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw_fast\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb_fast\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_backward_fast\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache_fast\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     27\u001b[0m \u001b[0mt2\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     28\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Desktop\\spring1819_assignment123\\assignment2\\cs231n\\fast_layers.py\u001b[0m in \u001b[0;36mconv_backward_strides\u001b[1;34m(dout, cache)\u001b[0m\n\u001b[0;32m    122\u001b[0m     \u001b[0mdx_cols\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mF\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout_reshaped\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    123\u001b[0m     \u001b[0mdx_cols\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mWW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout_h\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout_w\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 124\u001b[1;33m     \u001b[0mdx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcol2im_6d_cython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdx_cols\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mWW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpad\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstride\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    125\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    126\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'col2im_6d_cython' is not defined"
     ]
    }
   ],
   "source": [
    "# Rel errors should be around e-9 or less\n",
    "from cs231n.fast_layers import conv_forward_fast, conv_backward_fast\n",
    "from time import time\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 31, 31)\n",
    "w = np.random.randn(25, 3, 3, 3)\n",
    "b = np.random.randn(25,)\n",
    "dout = np.random.randn(100, 25, 16, 16)\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = conv_forward_naive(x, w, b, conv_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = conv_forward_fast(x, w, b, conv_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing conv_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('Difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive, dw_naive, db_naive = conv_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast, dw_fast, db_fast = conv_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting conv_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))\n",
    "print('dw difference: ', rel_error(dw_naive, dw_fast))\n",
    "print('db difference: ', rel_error(db_naive, db_fast))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Relative errors should be close to 0.0\n",
    "from cs231n.fast_layers import max_pool_forward_fast, max_pool_backward_fast\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 32, 32)\n",
    "dout = np.random.randn(100, 3, 16, 16)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = max_pool_forward_naive(x, pool_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = max_pool_forward_fast(x, pool_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing pool_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive = max_pool_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast = max_pool_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting pool_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolutional \"sandwich\" layers\n",
    "Previously we introduced the concept of \"sandwich\" layers that combine multiple operations into commonly used patterns. \n",
    "\n",
    "In the file `cs231n/layer_utils.py` you will find sandwich layers that implement a few commonly used patterns for convolutional networks. \n",
    "\n",
    "Run the cells below to sanity check they're working.\n",
    "\n",
    "前面我们介绍了“三明治”层的概念，它将多个操作组合成常用的模式。\n",
    "\n",
    "在文件`cs231n/layer_utils.py`中，你会发现三明治层实现了一些常用的卷积网络模式。\n",
    "\n",
    "运行下面的单元格以检查它们是否正常工作。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'col2im_6d_cython' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-12-9de04c1ed0d3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_relu_pool_forward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconv_param\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpool_param\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_relu_pool_backward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     12\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m \u001b[0mdx_num\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0meval_numerical_gradient_array\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mconv_relu_pool_forward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconv_param\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpool_param\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Desktop\\spring1819_assignment123\\assignment2\\cs231n\\layer_utils.py\u001b[0m in \u001b[0;36mconv_relu_pool_backward\u001b[1;34m(dout, cache)\u001b[0m\n\u001b[0;32m    115\u001b[0m     \u001b[0mds\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmax_pool_backward_fast\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpool_cache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    116\u001b[0m     \u001b[0mda\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrelu_backward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mds\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrelu_cache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 117\u001b[1;33m     \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_backward_fast\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mda\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconv_cache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    118\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Desktop\\spring1819_assignment123\\assignment2\\cs231n\\fast_layers.py\u001b[0m in \u001b[0;36mconv_backward_strides\u001b[1;34m(dout, cache)\u001b[0m\n\u001b[0;32m    122\u001b[0m     \u001b[0mdx_cols\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mF\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout_reshaped\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    123\u001b[0m     \u001b[0mdx_cols\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mWW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout_h\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout_w\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 124\u001b[1;33m     \u001b[0mdx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcol2im_6d_cython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdx_cols\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mWW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpad\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstride\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    125\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    126\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'col2im_6d_cython' is not defined"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_pool_forward, conv_relu_pool_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 16, 16)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "out, cache = conv_relu_pool_forward(x, w, b, conv_param, pool_param)\n",
    "dx, dw, db = conv_relu_pool_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu_pool')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'col2im_6d_cython' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-13-285900914e53>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      8\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[0mout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_relu_forward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconv_param\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 10\u001b[1;33m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_relu_backward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     11\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     12\u001b[0m \u001b[0mdx_num\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0meval_numerical_gradient_array\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mconv_relu_forward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconv_param\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Desktop\\spring1819_assignment123\\assignment2\\cs231n\\layer_utils.py\u001b[0m in \u001b[0;36mconv_relu_backward\u001b[1;34m(dout, cache)\u001b[0m\n\u001b[0;32m     55\u001b[0m     \u001b[0mconv_cache\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrelu_cache\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     56\u001b[0m     \u001b[0mda\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrelu_backward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrelu_cache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 57\u001b[1;33m     \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_backward_fast\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mda\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconv_cache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     58\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     59\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Desktop\\spring1819_assignment123\\assignment2\\cs231n\\fast_layers.py\u001b[0m in \u001b[0;36mconv_backward_strides\u001b[1;34m(dout, cache)\u001b[0m\n\u001b[0;32m    122\u001b[0m     \u001b[0mdx_cols\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mF\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout_reshaped\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    123\u001b[0m     \u001b[0mdx_cols\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mWW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout_h\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout_w\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 124\u001b[1;33m     \u001b[0mdx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcol2im_6d_cython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdx_cols\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mWW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpad\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstride\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    125\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    126\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'col2im_6d_cython' is not defined"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_forward, conv_relu_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 8, 8)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "out, cache = conv_relu_forward(x, w, b, conv_param)\n",
    "dx, dw, db = conv_relu_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_forward(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_forward(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_forward(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu:')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Three-layer ConvNet\n",
    "Now that you have implemented all the necessary layers, we can put them together into a simple convolutional network.\n",
    "\n",
    "Open the file `cs231n/classifiers/cnn.py` and complete the implementation of the `ThreeLayerConvNet` class. \n",
    "\n",
    "Remember you can use the fast/sandwich layers (already imported for you) in your implementation. \n",
    "\n",
    "Run the following cells to help you debug:\n",
    "\n",
    "现在您已经实现了所有必要的层，我们可以将它们放到一个简单的卷积网络中。\n",
    "\n",
    "打开文件`cs231n/classifiers/cnn.py`完成`ThreeLayerConvNet`类的实现。\n",
    "\n",
    "请记住，您可以在实现中使用fast/sandwich层(已经为您导入)。\n",
    "\n",
    "运行以下单元来帮助您调试:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sanity check loss\n",
    "After you build a new network, one of the first things you should do is sanity check the loss. \n",
    "\n",
    "When we use the softmax loss, we expect the loss for random weights (and no regularization) to be about `log(C)` for `C` classes. \n",
    "\n",
    "When we add regularization the loss should go up slightly.\n",
    "\n",
    "在你建立一个新的网络之后，你应该做的第一件事就是检查损失。\n",
    "\n",
    "当我们使用softmax损失时，我们期望随机权重的损失(没有正则化)是关于`log(C)`的`C`类。\n",
    "\n",
    "当我们加入正则化时，损失应该会稍微增加。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'col2im_6d_cython' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-5-16ad46d41b57>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m \u001b[0mloss\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgrads\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloss\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      8\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Initial loss (no regularization): '\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mloss\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Desktop\\spring1819_assignment123\\assignment2\\cs231n\\classifiers\\cnn.py\u001b[0m in \u001b[0;36mloss\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m    161\u001b[0m         \u001b[0mdX2\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrelu_backward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdX3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache_relu_2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    162\u001b[0m         \u001b[0mdX2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgrads\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'W2'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgrads\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'b2'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0maffine_backward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdX2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache_forward_2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 163\u001b[1;33m         \u001b[0mdX1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgrads\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'W1'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgrads\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'b1'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_relu_pool_backward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdX2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcache_forward_1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    164\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    165\u001b[0m         \u001b[0mgrads\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'W3'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgrads\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'W3'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreg\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparams\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'W3'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Desktop\\spring1819_assignment123\\assignment2\\cs231n\\layer_utils.py\u001b[0m in \u001b[0;36mconv_relu_pool_backward\u001b[1;34m(dout, cache)\u001b[0m\n\u001b[0;32m    115\u001b[0m     \u001b[0mds\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmax_pool_backward_fast\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpool_cache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    116\u001b[0m     \u001b[0mda\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrelu_backward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mds\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrelu_cache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 117\u001b[1;33m     \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconv_backward_fast\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mda\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconv_cache\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    118\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Desktop\\spring1819_assignment123\\assignment2\\cs231n\\fast_layers.py\u001b[0m in \u001b[0;36mconv_backward_strides\u001b[1;34m(dout, cache)\u001b[0m\n\u001b[0;32m    122\u001b[0m     \u001b[0mdx_cols\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mF\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdout_reshaped\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    123\u001b[0m     \u001b[0mdx_cols\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mWW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout_h\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout_w\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 124\u001b[1;33m     \u001b[0mdx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcol2im_6d_cython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdx_cols\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mC\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mHH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mWW\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpad\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstride\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    125\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    126\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mdx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdw\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'col2im_6d_cython' is not defined"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet()\n",
    "\n",
    "N = 50\n",
    "X = np.random.randn(N, 3, 32, 32)\n",
    "y = np.random.randint(10, size=N)\n",
    "\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (no regularization): ', loss)\n",
    "\n",
    "model.reg = 0.5\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (with regularization): ', loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gradient check\n",
    "After the loss looks reasonable, use numeric gradient checking to make sure that your backward pass is correct. \n",
    "\n",
    "When you use numeric gradient checking you should use a small amount of artifical data and a small number of neurons at each layer. \n",
    "\n",
    "Note: correct implementations may still have relative errors up to the order of e-2.\n",
    "\n",
    "在损失看起来合理之后，使用数值梯度检查来确保您的反向传播是正确的。\n",
    "\n",
    "当你使用数值梯度检查时，你应该在每一层使用少量的人工数据和少量的神经元。\n",
    "\n",
    "注意:正确的实现可能仍然有e-2数量级的相对错误。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_inputs = 2\n",
    "input_dim = (3, 16, 16)\n",
    "reg = 0.0\n",
    "num_classes = 10\n",
    "np.random.seed(231)\n",
    "X = np.random.randn(num_inputs, *input_dim)\n",
    "y = np.random.randint(num_classes, size=num_inputs)\n",
    "\n",
    "model = ThreeLayerConvNet(num_filters=3, filter_size=3,\n",
    "                          input_dim=input_dim, hidden_dim=7,\n",
    "                          dtype=np.float64)\n",
    "loss, grads = model.loss(X, y)\n",
    "# Errors should be small, but correct implementations may have\n",
    "# relative errors up to the order of e-2\n",
    "# 错误应该很小，但是正确的实现可能会有e-2数量级的相对错误\n",
    "for param_name in sorted(grads):\n",
    "    f = lambda _: model.loss(X, y)[0]\n",
    "    param_grad_num = eval_numerical_gradient(f, model.params[param_name], verbose=False, h=1e-6)\n",
    "    e = rel_error(param_grad_num, grads[param_name])\n",
    "    print('%s max relative error: %e' % (param_name, rel_error(param_grad_num, grads[param_name])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overfit small data\n",
    "A nice trick is to train your model with just a few training samples. \n",
    "\n",
    "You should be able to overfit small datasets, which will result in very high training accuracy and comparatively low validation accuracy.\n",
    "\n",
    "一个不错的技巧是使用一些训练样本来训练您的模型。\n",
    "\n",
    "您应该能够过拟合小的数据集，这将导致非常高的训练精度和相对较低的验证精度。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(231)\n",
    "\n",
    "num_train = 100\n",
    "small_data = {\n",
    "  'X_train': data['X_train'][:num_train],\n",
    "  'y_train': data['y_train'][:num_train],\n",
    "  'X_val': data['X_val'],\n",
    "  'y_val': data['y_val'],\n",
    "}\n",
    "\n",
    "model = ThreeLayerConvNet(weight_scale=1e-2)\n",
    "\n",
    "solver = Solver(model, small_data,\n",
    "                num_epochs=15, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=1)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the loss, training accuracy, and validation accuracy should show clear overfitting:\n",
    "\n",
    "绘制损失、训练精度和验证精度应该显示清楚的过拟合:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.subplot(2, 1, 1)\n",
    "plt.plot(solver.loss_history, 'o')\n",
    "plt.xlabel('iteration')\n",
    "plt.ylabel('loss')\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(solver.train_acc_history, '-o')\n",
    "plt.plot(solver.val_acc_history, '-o')\n",
    "plt.legend(['train', 'val'], loc='upper left')\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the net\n",
    "By training the three-layer convolutional network for one epoch, you should achieve greater than 40% accuracy on the training set:\n",
    "\n",
    "通过对三层卷积网络进行1个epoch的训练，训练集的准确率应达到40%以上:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "model = ThreeLayerConvNet(weight_scale=0.001, hidden_dim=500, reg=0.001)\n",
    "\n",
    "solver = Solver(model, data,\n",
    "                num_epochs=1, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=20)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize Filters\n",
    "You can visualize the first-layer convolutional filters from the trained network by running the following:\n",
    "\n",
    "你可以从训练好的网络中可视化第一层卷积滤波器，方法如下:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from cs231n.vis_utils import visualize_grid\n",
    "\n",
    "grid = visualize_grid(model.params['W1'].transpose(0, 2, 3, 1))\n",
    "plt.imshow(grid.astype('uint8'))\n",
    "plt.axis('off')\n",
    "plt.gcf().set_size_inches(5, 5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Spatial Batch Normalization\n",
    "We already saw that batch normalization is a very useful technique for training deep fully-connected networks. \n",
    "\n",
    "As proposed in the original paper (link in `BatchNormalization.ipynb`), batch normalization can also be used for convolutional networks, but we need to tweak it a bit; the modification will be called \"spatial batch normalization.\"\n",
    "\n",
    "我们已经看到，批量归一化对于训练深度全连接网络是一种非常有用的技术。\n",
    "\n",
    "正如在原文中提出的(link in `BatchNormalization.ipynb`)， 批量归一化也可以用于卷积网络，但是我们需要对它进行一些调整;修改将被称为“空间批量归一化”。\n",
    "\n",
    "Normally batch-normalization accepts inputs of shape `(N, D)` and produces outputs of shape `(N, D)`, where we normalize across the minibatch dimension `N`. \n",
    "\n",
    "For data coming from convolutional layers, batch normalization needs to accept inputs of shape `(N, C, H, W)` and produce outputs of shape `(N, C, H, W)` where the `N` dimension gives the minibatch size and the `(H, W)` dimensions give the spatial size of the feature map.\n",
    "\n",
    "通常，批量归一化接受shape`(N, D)`的输入，并生成shape`(N, D)`的输出，其中我们对整个minibatch维`N`进行归一化。\n",
    "\n",
    "对于来自卷积层的数据，批量归一化需要接收shape`(N, C, H, W)`的输入，生成shape`(N, C, H, W)`的输出，其中`N`维给出的是minibatch size，`(H, W)`维给出的是feature map的空间大小。\n",
    "\n",
    "If the feature map was produced using convolutions, then we expect every feature channel's statistics e.g. mean, variance to be relatively consistent both between different images, and different locations within the same image -- after all, every feature channel is produced by the same convolutional filter! \n",
    "\n",
    "Therefore spatial batch normalization computes a mean and variance for each of the `C` feature channels by computing statistics over the minibatch dimension `N` as well the spatial dimensions `H` and `W`.\n",
    "\n",
    "如果feature map是使用convolutions来生成的，那么我们希望每个feature channel的统计量，例如mean, variance，在不同的图像之间，以及在同一幅图像中的不同位置，都是相对一致的，毕竟每个feature channel都是使用相同的convolutional filter来生成的!\n",
    "\n",
    "因此，空间批量归一化通过计算minibatch维数`N`以及空间维数`H`和`W`上的统计信息来计算每个`C`特征通道的平均值和方差。\n",
    "\n",
    "[1] [Sergey Ioffe and Christian Szegedy, \"Batch Normalization: Accelerating Deep Network Training by Reducing\n",
    "Internal Covariate Shift\", ICML 2015.](https://arxiv.org/abs/1502.03167)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for spatial batch normalization in the function `spatial_batchnorm_forward`. \n",
    "\n",
    "Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [9.33463814 8.90909116 9.11056338]\n",
      "  Stds:  [3.61447857 3.19347686 3.5168142 ]\n",
      "After spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [ 6.18949336e-16  5.99520433e-16 -1.22124533e-16]\n",
      "  Stds:  [0.99999962 0.99999951 0.9999996 ]\n",
      "After spatial batch normalization (nontrivial gamma, beta):\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [6. 7. 8.]\n",
      "  Stds:  [2.99999885 3.99999804 4.99999798]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "# 通过空间批量归一化前后特征的方差和检验方法，对训练时间前向传播进行检验\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "\n",
    "print('Before spatial batch normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', x.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones(C), np.zeros(C)\n",
    "bn_param = {'mode': 'train'}\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to beta and stds close to gamma\n",
    "gamma, beta = np.asarray([3, 4, 5]), np.asarray([6, 7, 8])\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization (nontrivial gamma, beta):')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "After spatial batch normalization (test-time):\n",
      "  means:  [-0.08034406  0.07562881  0.05716371  0.04378383]\n",
      "  stds:  [0.96718744 1.0299714  1.02887624 1.00585577]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the test-time forward pass by running the training-time\n",
    "# forward pass many times to warm up the running averages, and then\n",
    "# checking the means and variances of activations after a test-time\n",
    "# forward pass.\n",
    "# 通过多次运行训练-时间前向传播来检查测试-时间前向传播，以使运行平均值预热，\n",
    "# 然后检查测试-时间前向传播后激活的平均值和方差。\n",
    "N, C, H, W = 10, 4, 11, 12\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "gamma = np.ones(C)\n",
    "beta = np.zeros(C)\n",
    "for t in range(50):\n",
    "  x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "  spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "bn_param['mode'] = 'test'\n",
    "x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "a_norm, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "\n",
    "# Means should be close to zero and stds close to one, but will be\n",
    "# noisier than training-time forward passes.\n",
    "print('After spatial batch normalization (test-time):')\n",
    "print('  means: ', a_norm.mean(axis=(0, 2, 3)))\n",
    "print('  stds: ', a_norm.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_batchnorm_backward`. \n",
    "\n",
    "Run the following to check your implementation using a numeric gradient check:\n",
    "\n",
    "运行以下程序来检查你的实现，使用数值梯度检查:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  2.7866481899887757e-07\n",
      "dgamma error:  7.0974817113608705e-12\n",
      "dbeta error:  3.275608725278405e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(C)\n",
    "beta = np.random.randn(C)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "fx = lambda x: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fg = lambda a: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fb = lambda b: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "#You should expect errors of magnitudes between 1e-12~1e-06\n",
    "_, cache = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "dx, dgamma, dbeta = spatial_batchnorm_backward(dout, cache)\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Group Normalization\n",
    "In the previous notebook, we mentioned that Layer Normalization is an alternative normalization technique that mitigates the batch size limitations of Batch Normalization. \n",
    "\n",
    "However, as the authors of [2] observed, Layer Normalization does not perform as well as Batch Normalization when used with Convolutional Layers:\n",
    "\n",
    "在前面的笔记中，我们提到了层归一化是一种替代的归一化技术，它减轻了批量归一化的批量大小限制。\n",
    "\n",
    "然而，正如[2]的作者所观察到的，当与卷积层一起使用时，层归一化的效果不如批量归一化:\n",
    "\n",
    ">With fully connected layers, all the hidden units in a layer tend to make similar contributions to the final prediction, and re-centering and rescaling the summed inputs to a layer works well. \n",
    "在完全连接的层中，一层中所有隐藏的单元都倾向于对最终预测，和重新中心化和重新缩放一层求和了的输入做出类似的贡献效果良好。\n",
    "However, the assumption of similar contributions is no longer true for convolutional neural networks. \n",
    "然而，对于卷积神经网络来说，类似贡献的假设不再成立。\n",
    "The large number of the hidden units whose receptive fields lie near the boundary of the image are rarely turned on and thus have very different statistics from the rest of the hidden units within the same layer.\n",
    "大量的隐藏单元，其接受域位于图像的边界附近，很少被打开，因此与同一层内的其他隐藏单元具有非常不同的统计。\n",
    "\n",
    "The authors of [3] propose an intermediary technique. \n",
    "\n",
    "In contrast to Layer Normalization, where you normalize over the entire feature per-datapoint, they suggest a consistent splitting of each per-datapoint feature into G groups, and a per-group per-datapoint normalization instead. \n",
    "\n",
    "[3]的作者提出了一种中间技术。\n",
    "\n",
    "与层归一化不同，层归一化是对整个特征逐个数据点地进行归一化，而他们则建议将逐个数据点的特征一致地划分为G组，对每个组每个数据点进行归一化。\n",
    "\n",
    "![Comparison of normalization techniques discussed so far](notebook_images/normalization.png)\n",
    "<center>**Visual comparison of the normalization techniques discussed so far (image edited from [3])**</center>\n",
    "\n",
    "Even though an assumption of equal contribution is still being made within each group, the authors hypothesize that this is not as problematic, as innate grouping arises within features for visual recognition. \n",
    "\n",
    "One example they use to illustrate this is that many high-performance handcrafted features in traditional Computer Vision have terms that are explicitly grouped together. \n",
    "\n",
    "Take for example Histogram of Oriented Gradients [4]-- after computing histograms per spatially local block, each per-block histogram is normalized before being concatenated together to form the final feature vector.\n",
    "\n",
    "尽管在每一组中仍然存在贡献相等的假设，但作者假设这不是问题，因为在视觉识别的特征中出现了天生的分组。\n",
    "\n",
    "他们用来说明这一点的一个例子是，在传统的计算机视觉中，许多高性能的手工制作的特性都有明确分组在一起的术语。\n",
    "\n",
    "以方向梯度直方图[4]为例——在计算每个空间局部块的直方图后，对每个块的直方图进行归一化处理，然后拼接在一起形成最终的特征向量。\n",
    "\n",
    "You will now implement Group Normalization. Note that this normalization technique that you are to implement in the following cells was introduced and published to ECCV just in 2018 -- this truly is still an ongoing and excitingly active field of research!\n",
    "\n",
    "现在您将实现组归一化。请注意，您将在以下cell中实现的这种归一化技术是在2018年引入并发布到ECCV的——这确实是一个正在进行的、令人兴奋的活跃的研究领域!\n",
    "\n",
    "[2] [Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. \"Layer Normalization.\" stat 1050 (2016): 21.](https://arxiv.org/pdf/1607.06450.pdf)\n",
    "\n",
    "\n",
    "[3] [Wu, Yuxin, and Kaiming He. \"Group Normalization.\" arXiv preprint arXiv:1803.08494 (2018).](https://arxiv.org/abs/1803.08494)\n",
    "\n",
    "\n",
    "[4] [N. Dalal and B. Triggs. Histograms of oriented gradients for\n",
    "human detection. In Computer Vision and Pattern Recognition\n",
    "(CVPR), 2005.](https://ieeexplore.ieee.org/abstract/document/1467360/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Group normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for group normalization in the function `spatial_groupnorm_forward`. \n",
    "\n",
    "Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [9.72505327 8.51114185 8.9147544  9.43448077]\n",
      "  Stds:  [3.67070958 3.09892597 4.27043622 3.97521327]\n",
      "After spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [-2.14643118e-16  5.25505565e-16  2.65528340e-16 -3.38618023e-16]\n",
      "  Stds:  [0.99999963 0.99999948 0.99999973 0.99999968]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "# 通过空间批量归一化前后特征的方差和检验方法，对训练时间前向传播进行检验\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "x_g = x.reshape((N*G,-1))\n",
    "print('Before spatial group normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x_g.mean(axis=1))\n",
    "print('  Stds: ', x_g.std(axis=1))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones((1,C,1,1)), np.zeros((1,C,1,1))\n",
    "bn_param = {'mode': 'train'}\n",
    "\n",
    "out, _ = spatial_groupnorm_forward(x, gamma, beta, G, bn_param)\n",
    "out_g = out.reshape((N*G,-1))\n",
    "print('After spatial group normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out_g.mean(axis=1))\n",
    "print('  Stds: ', out_g.std(axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial group normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_groupnorm_backward`. \n",
    "\n",
    "Run the following to check your implementation using a numeric gradient check:\n",
    "\n",
    "运行以下程序来检查你的实现，使用数值梯度检查:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  7.413109542981906e-08\n",
      "dgamma error:  9.468195772749234e-12\n",
      "dbeta error:  3.354494437653335e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(1,C,1,1)\n",
    "beta = np.random.randn(1,C,1,1)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "gn_param = {}\n",
    "fx = lambda x: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fg = lambda a: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fb = lambda b: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "_, cache = spatial_groupnorm_forward(x, gamma, beta, G, gn_param)\n",
    "dx, dgamma, dbeta = spatial_groupnorm_backward(dout, cache)\n",
    "#You should expect errors of magnitudes between 1e-12~1e-07\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 测试一下↓"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2, 3, 2, 2)\n",
      "[0.23004637 0.56776003]\n"
     ]
    }
   ],
   "source": [
    "# import numpy as np\n",
    "# y = np.array([1,2,4,3,7,4,2,5,9,6,7,5,1,2,3,2,0,2,9,8,6,8,9,8])\n",
    "# y = y.reshape(4,3,2)\n",
    "# print(y)\n",
    "# print(y)\n",
    "\n",
    "# y = np.array([[[[-0.08759809, -0.10987781],\n",
    "#                 [-0.18387192, -0.2109216]],\n",
    "#                [[0.21027089,  0.21661097],\n",
    "#                 [0.22847626,  0.23004637]],\n",
    "#                [[0.50813986,  0.54309974],\n",
    "#                 [0.64082444,  0.67101435]]],\n",
    "#               [[[-0.98053589, -1.03143541],\n",
    "#                 [-1.19128892, -1.24695841]],\n",
    "#                [[0.69108355,  0.66880383],\n",
    "#                 [0.59480972,  0.56776003]],\n",
    "#                [[2.36270298,  2.36904306],\n",
    "#                 [2.38090835,  2.38247847]]]])\n",
    "# print(y.shape)\n",
    "# print(y[:, 1, 1, 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
